﻿//-------------------------------------------------------------------
//	Copyright (c) 2010-2013  Zhirnov Andrey
//	This file is part of the "UX Standard Lib" project.
//	See copyright notice in "UX_STL_Ext.h".
//-------------------------------------------------------------------

#include "GLESRenderBuffer.h"
#include "GLESFrameBuffer.h"

namespace UX_STL
{
namespace GLESshell
{

//------------------------- GLESRenderBuffer ----------------------//
/*
=================================================
	конструктор
=================================================
*/
	GLESRenderBuffer::GLESRenderBuffer(): _uID(0)
	{
	}
	
/*
=================================================
	деструктор
=================================================
*/
	GLESRenderBuffer::~GLESRenderBuffer()
	{
		if ( _uID != 0 )
		{
			GLOM()->DeleteRenderbuffers( 1, &_uID );
			_uID = 0;
		}
	}

/*
=================================================
	создание рендербуфера
=================================================
*/
	bool GLESRenderBuffer::Create(gl_rt_format::type eFormat, const uvec3 &vDim, uint8 uSamples)
	{
		return Create( vDim.xy(), eFormat, uSamples );
	}

/*
=================================================
	создание рендербуфера
=================================================
*/
	bool GLESRenderBuffer::Create(const uvec2 &vDim, gl_rt_format::type eFormat, uint uSamples)
	{
		Destroy();
		CHECK_RETURN( GLOM()->GenRenderbuffers( 1, &_uID ) );

		_vDimension	= uvec3( vDim, 0 );
		_eIFormat	= eFormat;

		Bind();

		if ( EXT_multisampled_render_to_texture::IsSupported() && uSamples > 1 ) {
			GL_CALL( EXT_multisampled_render_to_texture::glRenderbufferStorageMultisample( Target(), uSamples, eFormat, vDim.x, vDim.y ) );
		} else {
			GL_CALL( glRenderbufferStorage( Target(), eFormat, vDim.x, vDim.y ) );
		}
		return true;
	}
	
/*
=================================================
	удаление рендербуфера
=================================================
*/
	void GLESRenderBuffer::Destroy()
	{
		if ( _uID != 0 )
		{
			GLOM()->DeleteRenderbuffers( 1, &_uID );
			_uID = 0;
		}
		_eIFormat	= gl_rt_format::_UNKNOWN;
		_vDimension	= uvec3();
	}

/*
=================================================
	присоединить рендербуфер к фреймбуферу
=================================================
*/
	void GLESRenderBuffer::Attach(GLESFrameBuffer *pFBO, gl_fbo_attach::type eAttach, uint uLevel)
	{
		pFBO->Attach( this, eAttach );
	}

	
//-------------------------------------------------------------------

}	// GLESshell
}	// UX_STL
